module Fastlane
  module Actions
    class BuildAndUploadToAppetizeAction < Action
      def self.run(params)
        tmp_path = "/tmp/fastlane_build"

        xcodebuild_configs = params[:xcodebuild]
        xcodebuild_configs[:sdk] = "iphonesimulator"
        xcodebuild_configs[:derivedDataPath] = tmp_path
        xcodebuild_configs[:xcargs] = "CONFIGURATION_BUILD_DIR=" + tmp_path
        xcodebuild_configs[:scheme] ||= params[:scheme] if params[:scheme].to_s.length > 0

        Actions::XcodebuildAction.run(xcodebuild_configs)

        app_path = Dir[File.join(tmp_path, "**", "*.app")].last
        UI.user_error!("Couldn't find app") unless app_path

        zipped_bundle = Actions::ZipAction.run(path: app_path,
                                        output_path: File.join(tmp_path, "Result.zip"))

        other_action.appetize(path: zipped_bundle,
                              api_token: params[:api_token],
                              public_key: params[:public_key],
                              note: params[:note])

        public_key = Actions.lane_context[SharedValues::APPETIZE_PUBLIC_KEY]
        UI.success("Generated Public Key: #{Actions.lane_context[SharedValues::APPETIZE_PUBLIC_KEY]}")

        FileUtils.rm_rf(tmp_path)

        return public_key
      end

      #####################################################
      # @!group Documentation
      #####################################################

      def self.description
        "Generate and upload an ipa file to appetize.io"
      end

      def self.details
        [
          "This should be called from danger.",
          "More information in the [device_grid guide](https://github.com/fastlane/fastlane/blob/master/fastlane/lib/fastlane/actions/device_grid/README.md)."
        ].join("\n")
      end

      def self.available_options
        [
          FastlaneCore::ConfigItem.new(key: :xcodebuild,
                                       description: "Parameters that are passed to the xcodebuild action",
                                       type: Hash,
                                       default_value: {},
                                       short_option: '-x',
                                       optional: true),
          FastlaneCore::ConfigItem.new(key: :scheme,
                                       description: "The scheme to build. Can also be passed using the `xcodebuild` parameter",
                                       type: String,
                                       short_option: '-s',
                                       optional: true),
          FastlaneCore::ConfigItem.new(key: :api_token,
                                       env_name: "APPETIZE_API_TOKEN",
                                       description: "Appetize.io API Token",
                                       sensitive: true,
                                       is_string: true),
          FastlaneCore::ConfigItem.new(key: :public_key,
                                       description: "If not provided, a new app will be created. If provided, the existing build will be overwritten",
                                       is_string: true,
                                       optional: true,
                                       verify_block: proc do |value|
                                         if value.start_with?("private_")
                                           UI.user_error!("You provided a private key to appetize, please provide the public key")
                                         end
                                       end),
          FastlaneCore::ConfigItem.new(key: :note,
                                       description: "Notes you wish to add to the uploaded app",
                                       is_string: true,
                                       optional: true)
        ]
      end

      def self.output
      end

      def self.return_value
        ""
      end

      def self.authors
        ["KrauseFx"]
      end

      def self.is_supported?(platform)
        platform == :ios
      end

      def self.example_code
        nil
      end

      def self.category
        :misc
      end
    end
  end
end
